package src.C_io;

import java.io.*;

// 文件加密
public class Demo10 {
    // 可以使用 ^ (异或符) 对文件进行加密和解密处理
    public static void main(String[] args) throws IOException {
        /*
        异或（^）操作就是相同为0，不同为1；也就是说同时为假才为假。（在计算机中默认1为真，实际上是只要非零为真，0为假）

        如果判断整数的话返回的也是整数，先会把相比的两个数转化成二进制，然后着一比较位，然后得到一个比较后的二进制，
        再把得到的二进制转化为十进制返回（ps：加解密的原理就是利用 (a^b)^b=a ）

        在Java中，异或运算是以二进制的形式进行计算的，当进行异或运算时，会先把两个数值转换成二进制，在进行异或运算。
        运算规则：在同位上的数值，相同则为0（都是0或者都是1），不同则为1（一个为0一个为1）
        运算定理：
        1、结合律：(a^b)^c=a^(b^c)
        2、交换律：a^b=b^a
        3、与自身异或：a^a=0
        4、与0异或：a^0=a
        */

        System.out.println(false ^ false);
        System.out.println(true ^ true);
        System.out.println(true ^ false);
        System.out.println((100 ^ 10) ^ 10);
        System.out.println(10 ^ 10);
        System.out.println(10 ^ 0);


        jm(new File("E:\\1.png"),new File("src\\C_io\\jiaMi.png")); // 加密
        jm(new File("src\\C_io\\jiaMi.png"),new File("src\\C_io\\jieMi.png")); // 解密

    }

    public static void jm(File file1, File file2) throws IOException {
        FileInputStream fis = new FileInputStream(file1);
        FileOutputStream fos = new FileOutputStream(file2);
        int b;
        while ((b = fis.read()) != -1){
            fos.write(b ^ 2);
        }
        fos.close();
        fis.close();
    }

}
